# -*- coding: utf-8 -*-
# Operaciones sobre gestión de proyectos (Nuevo / Abrir / Salvar).

## vipera, un diseñador de aplicaciones para Python
##     Copyright (C) 2011 Ángel Luis García García
##
##    This program is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program.  If not, see <http://www.gnu.org/licenses/>.

import wx
import wx.lib.agw.pybusyinfo as PBI

from operaciones_proy_vista import panel_oper_proy
from persistencia import wrapper_objeto
from configuracion_vipera import proy_por_defecto as por_defecto
from configuracion_vipera import enter
from i18n_vipera import t

class panel_oper_proy_p(panel_oper_proy):
    '''Panel de gestión de proyectos (Nuevo, Abrir, Salvar)'''
    def __init__(self, parent, idioma = None):
        '''Constructor de clase'''        
        panel_oper_proy.__init__(self, parent)
        # Cambiamos idioma.
        self.m_bitmap_logo.SetToolTipString(t(u'vipera, un diseñador de aplicaciones para Python', idioma))
        self.m_bpButton_nuevo.SetToolTipString(t(u'Nuevo proyecto', idioma))
        self.m_bpButton_abrir.SetToolTipString(t(u'Abrir proyecto', idioma))
        self.m_bpButton_salvar.SetToolTipString(t(u'Salvar proyecto', idioma))

    def abrir_proyecto(self, panel_principal, idioma):
        '''Método para cargar un proyecto de disco a memoria'''
        # Abrimos diálogo para abrir proyecto.
        aux = " (*.%s)|*.%s" % (por_defecto['ext_proy'], por_defecto['ext_proy'])
        wildcard = t(u"Proyecto vipera", idioma) + aux
        msj = t(u"Seleccione un fichero de proyecto", idioma)
        dlg = wx.FileDialog(panel_principal, message=msj, 
                            defaultDir=por_defecto['carpeta_proyecto'],
                            defaultFile="", wildcard=wildcard,
                            style=wx.OPEN) # | wx.MULTIPLE | wx.CHANGE_DIR
        # Mostramos el diálogo.
        if dlg.ShowModal() == wx.ID_OK: 
            ruta = dlg.GetPath()
            seguir = True
        else: 
            seguir = False
            
        # Limpiamos memoria.
        dlg.Destroy()
    
        # ¿Seguimos?
        if not seguir: return False
        
        # Limpiamos.
        self.nuevo_proyecto(panel_principal)
        
        # Información sobre la tarea.
        mensaje = t("Abriendo proyecto", idioma)
        busy = PBI.PyBusyInfo(mensaje, parent=None, title=t("Un momento...", idioma))
        wx.Yield()
            
        # #################################
        # ABRIR OBJETO SERIALIZADO EN DISCO
        # #################################
    
        # Motor de persistencia.
        f = wrapper_objeto()
    
        try:
            # Abrimos objeto.
            clase_objeto = f.cargar_objeto(ruta)
        except:
            del busy
            msj = t(u'No se pudo abrir el fichero de proyecto', idioma)
            wx.MessageBox(msj, t(u"Atención", idioma), wx.OK)
            return False
    
        # Recuperamos datos.
        objeto = clase_objeto.datos
    
        # ########################
        # Información del proyeto.
        # ########################
        
        try:
            x_conf_proyecto = objeto[0]['conf_proyecto']
            panel_principal.panel_conf_vipera.cargar_datos(x_conf_proyecto)
        except:
            del busy
            msj = t(u'No se pudo cargar configuración', idioma)
            wx.MessageBox(msj, t(u"Error al abrir fichero de proyecto", idioma), wx.OK)
            return False
        
        # #####################
        # Módulos del proyecto.
        # #####################
    
        try:
            x_modulos = objeto[1]['modulos']
            panel_principal.cargar_datos_modulo(x_modulos)
        except:
            del busy
            msj = t(u'No se pudo cargar estructura de módulos', idioma)
            wx.MessageBox(msj, t(u"Error al abrir fichero de proyecto"), wx.OK)
            return False
            
        # ####################
        # Package del proyeto.
        # ####################
        
        try:
            x_packages = objeto[2]['packages']
            panel_principal.panel_packages.cargar_datos(x_packages)
        except:
            del busy
            msj = t(u'No se pudo cargar árbol de packages', idioma)
            wx.MessageBox(msj, t(u"Error al abrir fichero de proyecto", idioma), wx.OK)
            return False
        
        # Limpiamos mensajes y devolvemos estado.
        del busy
        return True
        
    def salvar_proyecto(self, panel_principal, idioma = None):
        '''Método para salvar el proyecto'''
        nombre_proyecto = panel_principal.panel_conf_vipera.m_textCtrl_nproy.GetValue()
        if len(nombre_proyecto.strip()) == 0:
            wx.MessageBox(t(u"Hay que incluir un nombre de proyecto", idioma), t(u"Atención", idioma), wx.OK)
            return -1
        # Datos de configuración de proyecto.
        x_conf_proyecto = {'conf_proyecto' : panel_principal.panel_conf_vipera.salvar_datos()}
        # Datos de packages.
        x_packages = {'packages': panel_principal.panel_packages.salvar_datos()}
        # Datos de módulos.
        x_modulos = {'modulos' : panel_principal.salvar_datos_modulo()}
        
        # ##################################
        # ESTRUCTURA PARA SERIALIZAR A DISCO
        # ##################################
    
        # Objeto a serializar.
        objeto = [x_conf_proyecto, x_modulos, x_packages]
    
        # Formamos ruta.
        ruta = u'%s%s%s.%s' % (por_defecto['carpeta_proyecto'], por_defecto['sep'], nombre_proyecto, por_defecto['ext_proy'])
    
        # Motor de persistencia.
        f = wrapper_objeto()
        f.datos = objeto
    
        # Serializamos objeto.
        f.guardar_objeto(ruta)
    
        # Devolvemos resultado.
        return 0
    
    def nuevo_proyecto(self, panel_principal, idioma = None):
        '''Método para crear un proyecto nuevo'''
        # Información sobre la tarea.
        mensaje = t(u"Creando nuevo proyecto", idioma)
        busy = PBI.PyBusyInfo(mensaje, parent=None, title=t(u"Un momento...", idioma))
        wx.Yield()
        # Limpiar configuración de proyecto.
        panel_principal.panel_conf_vipera.limpiar_widget()
        # Limpiar módulos.
        panel_principal.lista_modulos = list()
        panel_principal.limpiar_widget_modulo()
        panel_principal.m_choice_modulos.SetItems([]) 
        # Limpiar packages.
        panel_principal.panel_packages.limpiar_widget()
        # Limpiar editor.
        panel_principal.panel_editor.set_codigo('', 1)
        # Limpiamos memoria.
        del busy
